package edu.upn.sigemfi.plt.bc;

import edu.upn.sigemfi.plt.be.Cuenta;
import edu.upn.sigemfi.plt.be.DetalleCuentaCliente;
import edu.upn.sigemfi.plt.be.TipoTipoCuenta;
import edu.upn.sigemfi.plt.be.TipoCuenta;
import edu.upn.sigemfi.seg.be.PersonaNatural;
import edu.upn.sigemfi.seg.be.PersonaJuridica;
//import edu.upn.sigemfi.seg.bc.SucursalFacadeLocal;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 *
 * @author Gerard
 */
public class CuentaDelegate {

    private CuentaFacadeLocal local;

    public CuentaDelegate() {
        local = lookupCuentaFacade();
    }

    public void crear(Cuenta cuenta) throws Exception {
        try {
            local.create(cuenta);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Crear Cuenta. " + e.getMessage(), e);
        }
    }

    public void editar(Cuenta cuenta) throws Exception {
        try {
            local.edit(cuenta);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Editar Cuenta. " + e.getMessage(), e);
        }
    }

    public void eliminar(Cuenta cuenta) throws Exception {
        try {
            local.remove(cuenta);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Eliminar Cuenta. " + e.getMessage(), e);
        }
    }

    public Cuenta buscar(Long codigo) throws Exception {
        try {
            return local.find(codigo);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar Cuenta. " + e.getMessage(), e);
        }
    }

    public List<Cuenta> listar() throws Exception {
        try {
            return local.findAll();
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Listar Cuenta. " + e.getMessage(), e);
        }
    }

    public Cuenta buscarCuentaPorNroCuenta(String nroCuenta) throws Exception {
        try {
            return local.buscarCuentaPorNroCuenta(nroCuenta);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar Cuenta por Nro Cuenta. " + e.getMessage(), e);
        }
    }

    public List<Cuenta> buscarCuentasPorDni(String dni) throws Exception {
        try {
            return local.buscarCuentasPorDni(dni);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar Cuenta por DNI. " + e.getMessage(), e);
        }
    }

    public List<Cuenta> buscarCuentasPorRuc(String ruc) throws Exception {
        try {
            return local.buscarCuentasPorRuc(ruc);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar Cuenta por RUC. " + e.getMessage(), e);
        }
    }

    public List<PersonaNatural> buscarPersonasNaturalesPorNroCuenta(String nroCuenta) throws Exception {
        try {
            return local.buscarPersonasNaturalesPorNroCuenta(nroCuenta);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar Personas Naturales por NroCuenta. " + e.getMessage(), e);
        }
    }

    public List<PersonaJuridica> buscarPersonasJuridicasPorNroCuenta(String nroCuenta) throws Exception {
        try {
            return local.buscarPersonasJuridicasPorNroCuenta(nroCuenta);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar Personas Juridicas por NroCuenta. " + e.getMessage(), e);
        }
    }

    public DetalleCuentaCliente buscarAsociacionPorClienteYCuenta(long idCuenta, long idpersona) throws Exception {
        try {
            return local.buscarAsociacionPorClienteYCuenta(idCuenta, idpersona);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar DetalleAsociacion entre Cuenta y Cliente. " + e.getMessage(), e);
        }
    }

    public List<Cuenta> buscarCuentaPorMontoActual(String signo, double montoActual) throws Exception {
        try {
            return local.buscarCuentaPorMontoActual(signo, montoActual);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar Personas Naturales por Monto Actual. " + e.getMessage(), e);
        }
    }

    public String buscarModalidadAfiliacionPorNumeroCuenta(long idCuenta) throws Exception {
        try {
            return local.buscarModalidadAfiliacionPorNumeroCuenta(idCuenta);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar Modadlidad de Afiliacion Cuenta. " + e.getMessage(), e);
        }
    }

    public List<Cuenta> buscarCuentasPorTipoCuenta(TipoTipoCuenta tipoTipoCuenta) throws Exception {
        try {
            return local.buscarCuentasPorTipoCuenta(tipoTipoCuenta);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar Tipotipo de Cuenta. " + e.getMessage(), e);
        }
    }

    public List<Cuenta> buscarCuentasPorTipoCuenta(TipoCuenta tipoCuenta) throws Exception {
        try {
            return local.buscarCuentasPorTipoCuenta(tipoCuenta);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar Tipo de Cuenta. " + e.getMessage(), e);
        }
    }

    public List<TipoCuenta> buscarTipoCuentaPorTipoTipoCuenta(TipoTipoCuenta tipoTipoCuenta) throws Exception {
        try {
            return local.buscarTipoCuentaPorTipoTipoCuenta(tipoTipoCuenta);
        } catch (Exception e) {
            local = lookupCuentaFacade();
            throw new Exception("Buscar TipoTipo de Cuenta. " + e.getMessage(), e);
        }
    }

    private CuentaFacadeLocal lookupCuentaFacade() {
        try {
            Context c = new InitialContext();
            return (CuentaFacadeLocal) c.lookup("java:comp/env/CuentaFacade");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }
}
